/**
 * Copyright 2011 Christian Padovano
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package it.sijom.adapter.impl;

import it.sijom.adapter.IDataAdapter;
import it.sijom.converters.XmlCalendarConverter;

import java.lang.reflect.InvocationTargetException;

import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.commons.beanutils.PropertyUtils;

public class XMLGregoriaCalendar2DateAdapter implements IDataAdapter {

	@Override
	public boolean check(Object source, Object target, String attributeName) {
		//se la sorgente e' XMLGregorianCalendar
		if (source instanceof javax.xml.datatype.XMLGregorianCalendar) {
			//e la destinazione e' un campo Date allora converte manualmente il campo
			//senza attivare il Converter che crerebbe solo un risultato indesiderato..
			try {
				if (PropertyUtils.
						 getPropertyDescriptor(target, attributeName).
						  getPropertyType().getName().endsWith("java.util.Date")) 
				{									
					return true; 						  
				}
			} catch (IllegalAccessException e) {
				return false;
			} catch (InvocationTargetException e) {
				return false;
			} catch (NoSuchMethodException e) {
				return false;
			}
		}
		return false;
	}

	@Override
	public void copy(Object source, Object target, String attributeName)
			throws InstantiationException, IllegalAccessException,
			InvocationTargetException, NoSuchMethodException 
	{
		 java.util.Date mydate = (java.util.Date) XmlCalendarConverter.getDateFromXmlGregorianCalendarNoTime((XMLGregorianCalendar)source);
		 PropertyUtils.getPropertyDescriptor(target, attributeName).getWriteMethod().invoke(target, mydate);			

	}

}
